import z from 'zod';
import { Router } from 'express';
import authController from '@/controller/authController';
import { authenticate } from '@/middleware/auth';
import { rateLimit } from '@/middleware/rateLimit';
import validateSchema from '@/middleware/validateSchema';



// Zod 验证 schemas
const registerSchema = z.object({
  body: z.object({
    email: z
      .string()
      .email('请输入有效的邮箱地址')
      .min(1, '邮箱不能为空'),
    username: z
      .string()
      .min(3, '用户名长度必须至少3个字符')
      .max(20, '用户名长度不能超过20个字符')
      .regex(/^[a-zA-Z0-9_]+$/, '用户名只能包含字母、数字和下划线')
      .optional(),
    password: z
      .string()
      .min(6, '密码长度必须至少6个字符')
      .max(50, '密码长度不能超过50个字符')
      .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, '密码必须包含至少一个小写字母、一个大写字母和一个数字'),
  }),
});

const loginSchema = z.object({
  body: z.object({
    email: z
      .string()
      .email('请输入有效的邮箱地址')
      .min(6, '邮箱不能为空'),
    password: z
      .string()
      .min(6, '密码不能为空'),
  }),
});

const changePasswordSchema = z.object({
  body: z.object({
    oldPassword: z
      .string()
      .min(1, '当前密码不能为空'),
    newPassword: z
      .string()
      .min(6, '新密码长度必须至少6个字符')
      .max(50, '新密码长度不能超过50个字符')
      .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, '新密码必须包含至少一个小写字母、一个大写字母和一个数字'),
  }),
});

const emailSchema = z.object({
  body: z.object({
    email: z
      .string()
      .email('请输入有效的邮箱地址')
      .min(1, '邮箱不能为空'),
  }),
});

const resetPasswordSchema = z.object({
  body: z.object({
    email: z
      .string()
      .email('请输入有效的邮箱地址')
      .min(1, '邮箱不能为空'),
    newPassword: z
      .string()
      .min(6, '新密码长度必须至少6个字符')
      .max(50, '新密码长度不能超过50个字符')
      .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, '新密码必须包含至少一个小写字母、一个大写字母和一个数字'),
    resetCode: z
      .string()
      .length(6, '验证码长度必须为6位')
      .regex(/^[0-9A-Z]+$/, '验证码只能包含数字和大写字母'),
  }),
});

const refreshTokenSchema = z.object({
  body: z.object({
    refreshToken: z
      .string()
      .min(1, '刷新令牌不能为空'),
  }),
});


const router = Router();


router.post(
  '/register',
  rateLimit({ max: 5, windowMs: 5 * 60 * 1000, identifier: 'auth:register' }), // 5分钟内最多5次注册尝试
  validateSchema(registerSchema),
  authController.register
);


router.post(
  '/login',
  rateLimit({ max: 10, windowMs: 5 * 60 * 1000, identifier: 'auth:login' }), // 5分钟内最多10次登录尝试
  validateSchema(loginSchema),
  authController.login
);


router.post(
  '/refresh',
  rateLimit({ max: 20, windowMs: 5 * 60 * 1000, identifier: 'auth:refresh' }), // 5分钟内最多20次刷新
  validateSchema(refreshTokenSchema),
  authController.refreshToken
);


router.post(
  '/logout',
  authenticate,
  authController.logout
);


router.get(
  '/me',
  authenticate,
  authController.getCurrentUser
);


router.put(
  '/change-password',
  authenticate,
  rateLimit({ max: 5, windowMs: 60 * 60 * 1000, identifier: 'auth:change-password' }), // 1小时内最多5次修改密码
  validateSchema(changePasswordSchema),
  authController.changePassword
);


router.post(
  '/forgot-password',
  rateLimit({ max: 3, windowMs: 60 * 60 * 1000, identifier: 'auth:forgot-password' }), // 1小时内最多3次忘记密码请求
  validateSchema(emailSchema),
  authController.sendPasswordResetEmail
);


router.post(
  '/reset-password',
  rateLimit({ max: 5, windowMs: 60 * 60 * 1000, identifier: 'auth:reset-password' }), // 1小时内最多5次重置密码
  validateSchema(resetPasswordSchema),
  authController.resetPassword
);

export default router; 